package serveur;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Singleton;
import javax.ejb.StatefulTimeout;

import anneau.Noeud_ITF;


/**
 * Session Bean implementation class Serveur_Central_Bean
 */
@Singleton(name = "Serveur_Central_Bean")
@StatefulTimeout(unit = java.util.concurrent.TimeUnit.MINUTES, value = -1)
//@Local(Serveur_Central_ITF.class)
@LocalBean
public class Serveur_Central_Bean implements Serveur_Central_ITF {
	// ATTRIBUTS
	private static List<Noeud_ITF> anneau;
	
    
	// CONSTRUCTEURS
	public Serveur_Central_Bean() {
    	System.out.println("new Serveur_Central_Bean");
    	anneau = new ArrayList<Noeud_ITF>();
    }
	
	
	// METHODES
	@Override
	public Noeud_ITF connexion(Noeud_ITF noeud) {
		System.out.println("Serveur_Central.connexion");
		System.out.println("Serveur_Central : Il y a " + anneau.size() + " Noeud(s) dans l'anneau.");
    	// On ajoute le noeud à l'anneau.
    	anneau.add(noeud);
	    
    	if(anneau.size() > 1) {
	    	// On lui defini son precedent (l'ancien dernier noeud).
	    	noeud.setPrecedent(anneau.get(anneau.indexOf(noeud) - 1));
	    	// On lui defini son suivant (le premier noeud).
	    	noeud.setSuivant(anneau.get(0));
	    	// On actualise son precedent.
	    	anneau.get(anneau.indexOf(noeud) - 1).setSuivant(noeud);
	    	// On actualise le premier noeud.
	    	anneau.get(0).setPrecedent(noeud);
    	}
    	else {
    		noeud.setPrecedent(noeud);
    		noeud.setSuivant(noeud);
    	}
    	System.out.println("Serveur_Central : Noeud integre a l'anneau.");
		System.out.println("Serveur_Central : Il y a " + anneau.size() + " Noeud(s) dans l'anneau.");
    	
		return noeud;
    }
	
	@Override
	public void deconnexion(Noeud_ITF noeud) {
		boolean ok = false;
		System.out.println("noeud UUID demandé : " + noeud.getUuid());
		
    	for(Noeud_ITF noeud_tmp : anneau) {
    		System.out.println("Noeud scanné : " + noeud.getUuid());
    		if(noeud_tmp.getUuid().equals(noeud.getUuid())) {
    			System.out.println("On a trouvé le bon noeud !");
    			Noeud_ITF noeud_precedent = noeud_tmp.getPrecedent();
    			Noeud_ITF noeud_suivant = noeud_tmp.getSuivant();
    			noeud_suivant.setPrecedent(noeud_precedent);
    			noeud_precedent.setSuivant(noeud_suivant);
    			anneau.remove(noeud_tmp);
    			ok = true;
    			break;
    		}
    	}
    	
		if(ok) {
			System.out.println("Le Noeud a ete supprime.");
			System.out.println("Il y a " + anneau.size() + " noeuds dans l'anneau.");
		}
		else {
			System.out.println("Le Noeud n'a pas ete trouve.");
			System.out.println("Il y a toujours " + anneau.size() + " noeuds dans l'anneau.");
		}
    }
}
